강의 소개

통계교육원 R 고급 통계분석

강의기간 : 2021. 7. 14. ~ 2021. 7. 16.

주요 강의 내용

R 기초

dplyr 패키지를 이용한 자료 핸들링

데이터 종류에 따른 분석기법

군집분석 (Day2)

분류분석 (Day2)

실제 데이터를 활용한 분석 실습

인공신경망 (Day3)

데이터 분석을 심도 있게 진행하기 위해서는 기본 통계지식이 필요합니다.

통계를 이해하기 위해선 복잡한 수학 기호보다는 논리적 사고가 중요합니다.

이런 논리적 사고를 통해 세상을 데이터로 이해하는 시각을 키워갈 수 있습니다.

데이터 분석의 목적은 더 나은 의사 결정이다.

데이터 분석을 한 마디로 정의하면 “데이터의 패턴을 파악해 미래를 예측하고, 이로써 유리한 의사결정을 하기 위한 일련의 과정”이라 할 수 있습니다.

알고리즘을 구현하는데 많이 쓰이는 프로그래밍 언어는 R, Python, Matlab입니다.

R : 통계학에 뿌리 (데이터 분석을 할 때 대중적으로 많이 쓰이는 언어)

  • 통계가 좀 더 중시되는 분야 : 실험연구, 비즈니스 의사결정, 사회과학적 조사 등

  • Python이나 Matlab보다 상대적으로 쉬움

Matlab : 공학 수학에 특화

Python : 프로그램 코딩을 위한 언어

  • R보다 코딩에 치중한 언어(전산학 뿌리)로 자유도가 높아 다양한 분야에서 쉽게 사용

  • 기존 시스템에 인공지능을 엊어야 하는 상황이라면 Python이 유리

  • 데이터 수집 및 정리에 매우 큰 강점

Why R?

\(R\) 을 공부해야하는 다양한 이유가 있지만 몇가지 추리면 다음과 같다.

  1. \(R\) is freely and easily accesible.

    쉽게 접근할 수 있고 자유롭게 이용할 수 있다. 인터넷만 연결되어 있다면 사이트에서 다운 받아 설치하면 언제 어디서든지 사용할 수 있다. 또한 돈을 낼 필요 없는 공짜(freeware)이다.

  2. For a software environment with a primarily statical focus.

    통계분석을 목적으로 개발되어 많은 사용자들이 커뮤니티를 통해 정보를 주고 받고 있다. 사회과학, 자연과학, 의약학 등 많은 분야의 연구자들이 본인이 작성한 코드를 공유하며 서로의 지식을 발전시켜 나가고 있다.

  3. \(R\) is open source.

    R의 팩키지를 이용하면서 핵심 알고리즘이 궁금한 경우 소스코드를 다운로드받아 직접 확인할 수 있어 연구에 사용되는 함수의 이해도를 높일 수 있다.

  4. \(R\) is reasonably fast in ordinary tasks.

    다른 통계프로그램인 SPSS, Stats, SAS 등에 비해 계산시간이 빠르다. 심지어 Rcpp 패키지를 통해 C언어를 구현할 수 있어 다른 프로그램에 비해 상대적으로 계산시간을 단축시킬 수 있다.

  5. \(R\) is powerful in creating data visualizations.

    \(R\)은 자료 (data) 시각화를 쉽게 할 수 있다. 많은 양의 데이터를 시각화 한다면 데이터의 특징을 쉽게 이해하고 분석할 수 있다. R을 이용한 시각화에 관심이 있으면 https://www.r-graph-gallery.com/을 참고바란다. 아래 그림은 시계열 자료의 시각화 예이다. 다른 프로그램과 달리 상호교류가능한 (interactive) 그림을 그릴 수 있다.

  1. Work in \(R\) is mainly command line based.

    처음 프로그램 이용하는 사람에게 단점처럼 보이나 명령어 방식의 분석은 반복적인 분석을 수행하거나 재분석을 수행할때 엄청난 장점이 된다.

  2. \(R\) is not picky about operating systems.

    요즘 프로그램처럼 \(R\)은 윈도우, 맥, 리눅스와 같이 운영체제에 구애받지 않고 돌아간다.

  3. Finally, \(R\) is the entire package from start to finish.

들어가기

통계분석(또는 데이터과학)의 프로그래밍은 일반적으로 다음 과정으로 진행된다.

  1. Import : 자료 불러오기 (여러 유형의 자료 file, database, web API 등)

    만약 자료를 불러오지 못한다면, 더이상 통계분석을 할 수 없습니다.

  2. Tidy : 자료 정리하기

    Import로 가져온 자료를 확인 (변수명, 자료의 수, 등) head, tail, dim, str, View, summary 등의 함수를 통해 확인

  3. Transform : 자료 변환

    필요한 변수와 자료 선택, 표준화 등 불러온 raw data를 분석하기 쉽게 재정리

  4. Visualise : 시각화

    통계 분석 전 결과가 어떻게 나올 것인지 탐색하는 단계

  5. Model : 통계분석

    통계적 가설을 세우고 통계적 가설검정

  6. Communicate : 소통하기

    R을 통해 분석한 결과를 보고서 또는 시각화하여 의사결정에 활용

1부터 6까지를 한꺼번에 R을 통해 처리할 수 있고 그 과정이 programming 됩니다.

R 기초 : 벡터(vector)

R 의 기본 연산단위는 벡터이며, x <- c(1, 2, 3) 은 1,2,3 으로 이루어진 길이 3인 벡터를 x 에 저장한다. 대입연산자는 =<- 둘 다 가능하지만 함수의 인자로도 쓰이는 = 와 구별하기 위해 <- 를 권장한다.

math <- c(70,80,90,80,60)
eng <- c(80,85,90,85,95)
math+eng 
## [1] 150 165 180 165 155
math*eng
## [1] 5600 6800 8100 6800 5700
math %/% 10
## [1] 7 8 9 8 6
math %/% 10
## [1] 7 8 9 8 6
sqrt(math)
## [1] 8.366600 8.944272 9.486833 8.944272 7.745967
sum(math)
## [1] 380
diff(math)
## [1]  10  10 -10 -20
mean(math)
## [1] 76
var(math)
## [1] 130
sd(math)
## [1] 11.40175
median(math)
## [1] 80
range(math)
## [1] 60 90
IQR(math)
## [1] 10
max(math)
## [1] 90
which.min(math)
## [1] 5
length(math)
## [1] 5

벡터에서 특정 항목을 골라내기 위해선 중괄호[]를 이용하여 위치 혹은 조건문을 주면 된다.

math[2]
## [1] 80
math[-2]
## [1] 70 90 80 60
math[2:4]
## [1] 80 90 80
math[c(1,5,3)]
## [1] 70 60 90
math>75
## [1] FALSE  TRUE  TRUE  TRUE FALSE
math[math>75]
## [1] 80 90 80
math[math %in% c(80, 90)]
## [1] 80 90 80

R 기초 : 조건문(for, if, ifelse)

if 조건문

if (test_expression) {

statement

}

for(values in 1:10)
{if (values <= 10)                                
print(paste(values, "is less than or equal to 10"))
}
## [1] "1 is less than or equal to 10"
## [1] "2 is less than or equal to 10"
## [1] "3 is less than or equal to 10"
## [1] "4 is less than or equal to 10"
## [1] "5 is less than or equal to 10"
## [1] "6 is less than or equal to 10"
## [1] "7 is less than or equal to 10"
## [1] "8 is less than or equal to 10"
## [1] "9 is less than or equal to 10"
## [1] "10 is less than or equal to 10"
for(values in 1:10)
{if (values <= 5)                                
print(paste(values, "is less than or equal to 5")) 
}
## [1] "1 is less than or equal to 5"
## [1] "2 is less than or equal to 5"
## [1] "3 is less than or equal to 5"
## [1] "4 is less than or equal to 5"
## [1] "5 is less than or equal to 5"
  • 한줄로 표현된 경우 {}을 생략해도 괜찮습니다.

if-else 조건문

  • else는 앞의 if문이 참이 아닐때 실행됩니다.

if (test_expression) {

statement

} else {

statement

}

x <- -4
if(x > 0) # 조건을 만족하지 않으므로 else문이 실행됩니다.
  { print("양수입니다.")
} else { 
  print("양수가 아닙니다.")
}
## [1] "양수가 아닙니다."

아래와 같이 사용하면 오류가 발생하고 실행되지 않습니다.

x <- -4
if(x > 0) # 조건을 만족하지 않으므로 아래의 문장이 실행되지 않습니다.
  print("양수입니다.")
 } else 
   {print("양수가 아닙니다.")}

하지만 아래와 같이 else 다음에 한줄로 된 코드를 입력하면 문제 없이 실행됩니다.

x <- -4
if(x > 0) # 조건을 만족하지 않으므로 아래의 문장이 실행되지 않습니다.
 { print("양수입니다.")
 } else print("양수가 아닙니다.")
## [1] "양수가 아닙니다."

if 문에서 else if로 여러 조건을 줄 수 있습니다.

if ( test_expression1) {

statement1

} else if ( test_expression2) {

statement2 } else if ( test_expression3) {

statement3

} else {

statement4

}

x <- 0
if (x < 0) {
print("Negative number")
} else if (x > 0) {
print("Positive number")
} else
print("Zero")
## [1] "Zero"

for 반복문

values <- c(1,7,5,3,9)

for(id in 1:5){

print(values[id])

}

if와 for문을 이용한 예제

Q1. if와 for를 이용하여 50부터 100까지 6의 배수의 합을 구하여라.

sum=0
for(i in 50:100){
if(i %% 6==0) sum=sum+i
}
print(sum)
## [1] 600

Q2. 2,5,3,9,8,11,6에서 짝수의 갯 수를 if와 for 문으로 구하여라.

x <- c(2,5,3,9,8,11,6)
count <- 0
for (val in x) {
if(val %% 2 == 0)  count = count+1
}
print(count)
## [1] 3

연습 : 10!을 계산하세요.

## [1] 3628800

데이터 불러오기(Import)

이제 실제 자료를 읽고 확인하는 방법입니다.

자료를 불러오기 전에 미리 작업폴더를 R에서 지정하면 그 다음부터 편하게 작업하실 수 있습니다.

getwd()함수를 사용하면 현재 작업중인 폴더를 확인할 수 있습니다.

getwd()
## [1] "C:/Users/stats/Documents/advanced1"

setwd()함수를 사용하면 원하는 위치로 작업폴더를 설정할 수 있어 자료를 쉽게 불러올 수 있습니다.

setwd("C:/Users/stats/Documents/advanced1")
getwd()
## [1] "C:/Users/stats/Documents/advanced1"

여기서 주의해야할 부분은 폴더구분을 / 또는 ’\’로 해야합니다. R은 유닉스 기반으로 구축되어 윈도우에서 사용하는 \를 위치로 인식하지 못하기 때문입니다.

R의 데이터는 가급적이면 csv로 만들어서 불러오는게 편합니다. csv(comma seperated variables) 용량이 작고 어떤 소프트웨어에서도 쉽게 사용할 수 있기 때문입니다. 한글이 포함된 엑셀, SPSS, SAS파일를 R에서 불러올 경우 encoding 에러가 발생할 수 있으니 주의가 필요합니다.

ex <- read.csv("diet.csv")
head(ex)
##   Person gender Age Height pre.weight Diet weight6weeks
## 1     25     NA  41    171         60    2         60.0
## 2     26     NA  32    174        103    2        103.0
## 3      1      0  22    159         58    1         54.2
## 4      2      0  46    192         60    1         54.0
## 5      3      0  55    170         64    1         63.3
## 6      4      0  33    171         64    1         61.1

엑셀파일은 readxl 팩키지 그리고 SAS나 SPSS는 foreign 혹은 haven 패키지를 이용하면 불러오고 저장할 수 있다.

library(readxl)

ex_excel <- read_excel("diet.xlsx")

library(haven)
## Warning: package 'haven' was built under R version 4.0.5
# write_sas(ex, "example.sas7bdat")
# write_sav(ex, "example.sav")

# ex_sas <-  read_sas("example.sas7bdat")                 
# ex.spss <- read_sav("example.sav")    

데이터 확인 (Tidy)

데이터를 import 한 후에는 데이터가 잘 불러와졌는지 확인해야합니다.

head(ex)
##   Person gender Age Height pre.weight Diet weight6weeks
## 1     25     NA  41    171         60    2         60.0
## 2     26     NA  32    174        103    2        103.0
## 3      1      0  22    159         58    1         54.2
## 4      2      0  46    192         60    1         54.0
## 5      3      0  55    170         64    1         63.3
## 6      4      0  33    171         64    1         61.1
tail(ex)
##    Person gender Age Height pre.weight Diet weight6weeks
## 73     73      1  40    179         79    3         74.5
## 74     74      1  35    183         83    3         80.2
## 75     75      1  49    177         84    3         79.9
## 76     76      1  28    164         85    3         79.7
## 77     77      1  40    167         87    3         77.8
## 78     78      1  51    175         88    3         81.9
head(ex,10)
##    Person gender Age Height pre.weight Diet weight6weeks
## 1      25     NA  41    171         60    2         60.0
## 2      26     NA  32    174        103    2        103.0
## 3       1      0  22    159         58    1         54.2
## 4       2      0  46    192         60    1         54.0
## 5       3      0  55    170         64    1         63.3
## 6       4      0  33    171         64    1         61.1
## 7       5      0  50    170         65    1         62.2
## 8       6      0  50    201         66    1         64.0
## 9       7      0  37    174         67    1         65.0
## 10      8      0  28    176         69    1         60.5
str(ex)
## 'data.frame':    78 obs. of  7 variables:
##  $ Person      : int  25 26 1 2 3 4 5 6 7 8 ...
##  $ gender      : int  NA NA 0 0 0 0 0 0 0 0 ...
##  $ Age         : int  41 32 22 46 55 33 50 50 37 28 ...
##  $ Height      : int  171 174 159 192 170 171 170 201 174 176 ...
##  $ pre.weight  : int  60 103 58 60 64 64 65 66 67 69 ...
##  $ Diet        : int  2 2 1 1 1 1 1 1 1 1 ...
##  $ weight6weeks: num  60 103 54.2 54 63.3 61.1 62.2 64 65 60.5 ...
names(ex)
## [1] "Person"       "gender"       "Age"          "Height"       "pre.weight"  
## [6] "Diet"         "weight6weeks"
dim(ex)
## [1] 78  7
ncol(ex)
## [1] 7
nrow(ex)
## [1] 78
summary(ex)
##      Person          gender            Age            Height     
##  Min.   : 1.00   Min.   :0.0000   Min.   :16.00   Min.   :141.0  
##  1st Qu.:20.25   1st Qu.:0.0000   1st Qu.:32.25   1st Qu.:164.2  
##  Median :39.50   Median :0.0000   Median :39.00   Median :169.5  
##  Mean   :39.50   Mean   :0.4342   Mean   :39.15   Mean   :170.8  
##  3rd Qu.:58.75   3rd Qu.:1.0000   3rd Qu.:46.75   3rd Qu.:174.8  
##  Max.   :78.00   Max.   :1.0000   Max.   :60.00   Max.   :201.0  
##                  NA's   :2                                       
##    pre.weight          Diet        weight6weeks   
##  Min.   : 58.00   Min.   :1.000   Min.   : 53.00  
##  1st Qu.: 66.00   1st Qu.:1.000   1st Qu.: 61.85  
##  Median : 72.00   Median :2.000   Median : 68.95  
##  Mean   : 72.53   Mean   :2.038   Mean   : 68.68  
##  3rd Qu.: 78.00   3rd Qu.:3.000   3rd Qu.: 73.83  
##  Max.   :103.00   Max.   :3.000   Max.   :103.00  
## 

데이터의 열에 해당하는 변수는 특수문자 $를 이용하여 확인할 수 있습니다.

혹은 중괄호[]를 이용해서도 확인하실 수 있습니다.

두개 이상의 변수를 한번에 선택하기 위해선 c()함수를 이용하면 됩니다.

ex$gender
##  [1] NA NA  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
## [26]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  1
## [51]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
## [76]  1  1  1
ex[,2]
##  [1] NA NA  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
## [26]  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  1
## [51]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
## [76]  1  1  1
ex[,c(1,4,6)]
##    Person Height Diet
## 1      25    171    2
## 2      26    174    2
## 3       1    159    1
## 4       2    192    1
## 5       3    170    1
## 6       4    171    1
## 7       5    170    1
## 8       6    201    1
## 9       7    174    1
## 10      8    176    1
## 11      9    165    1
## 12     10    165    1
## 13     11    173    1
## 14     12    156    1
## 15     13    163    1
## 16     14    167    1
## 17     27    174    2
## 18     28    172    2
## 19     29    165    2
## 20     30    171    2
## 21     31    169    2
## 22     32    174    2
## 23     33    163    2
## 24     34    173    2
## 25     35    166    2
## 26     36    163    2
## 27     37    165    2
## 28     38    167    2
## 29     39    161    2
## 30     40    169    2
## 31     52    165    3
## 32     53    169    3
## 33     54    159    3
## 34     55    169    3
## 35     56    160    3
## 36     57    169    3
## 37     58    163    3
## 38     59    155    3
## 39     60    141    3
## 40     61    170    3
## 41     62    170    3
## 42     63    171    3
## 43     64    171    3
## 44     65    153    3
## 45     66    157    3
## 46     15    168    1
## 47     16    158    1
## 48     17    173    1
## 49     18    160    1
## 50     19    162    1
## 51     20    165    1
## 52     21    177    1
## 53     22    166    1
## 54     23    166    1
## 55     24    190    1
## 56     41    191    2
## 57     42    199    2
## 58     43    196    2
## 59     44    190    2
## 60     45    160    2
## 61     46    194    2
## 62     47    163    2
## 63     48    171    2
## 64     49    198    2
## 65     50    180    2
## 66     51    182    2
## 67     67    155    3
## 68     68    179    3
## 69     69    166    3
## 70     70    173    3
## 71     71    177    3
## 72     72    179    3
## 73     73    179    3
## 74     74    183    3
## 75     75    177    3
## 76     76    164    3
## 77     77    167    3
## 78     78    175    3
ex[1:5,c(1,4,6)]
##   Person Height Diet
## 1     25    171    2
## 2     26    174    2
## 3      1    159    1
## 4      2    192    1
## 5      3    170    1